使用過Ruby方法的村民們一定都知道,舉例來說像是 .map .select .reduce 等方法
後面都會銜接一段 block, block內部會編寫一些邏輯來達到我們希望得到的目的。
2.6.3 :001 > a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
2.6.3 :002 > a.select{|x| x < 5}
=> [1, 2, 3, 4]
2.6.3 :003 > a.select do |x|
2.6.3 :004 > x < 5
2.6.3 :005?> end
=> [1, 2, 3, 4]
而block的寫法可以使用 do end 或 {} 兩種得到一樣的結果。
一般對我來說,若是可以一行寫完的會選擇使用{},
若遇上比較複雜的判斷就會使用 do end的搭配。
但,難道Ruby村村長是因為無聊才創造出兩種不同寫法但卻完全沒有特異之處嗎?
今天我們就是想討論這個,
兩者的寫法雖大抵情況下可以得到相同的情況,但還是有例外的情況,
那,究竟是差在哪裡呢?
我們先來看看以下程式碼:
2.6.3 :001 > a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
2.6.3 :002 > p a.map{|x| x * 2}
[2, 4, 6, 8, 10]
=> [2, 4, 6, 8, 10]
2.6.3 :003 > p a.map do |x| x * 2 end
#<Enumerator: [1, 2, 3, 4, 5]:map>
=> #<Enumerator: [1, 2, 3, 4, 5]:map>
咦,不是說會得到一樣的答案嗎?
原來, do end 跟 {}之間的差異,在於優先順序
上會有不同,
簡單來說 今天我們使用p來印出結果的時候
{}看起來像是 p(a.map{|x| x * 2}),待()裡面的運算完成後,才印出得到[2,4,6,8,10];
相反的,do end的情況比較像是 p(a.map)do |x| x * 2 end,
p 先把 a 給印出來了,所以我們得到了[1,2,3,4,5]。
以上,就是今天介紹 do end 與 {} 的差異。